package com.cskaoyan._03innerclazz._02member._02basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/13 11:15
 **/
/*
外部类和成员内部的关系:
    把成员内部类当做外部类的一个成员看待

成员内部类访问特点
    内部类----->外部类
        可以通过成员名直接访问,内部类持有外部类对象的引用
        特殊: 如果出现内部类外部类同名的成员,如何区分?
            this.访问的是内部类成员
            外部类.this.访问的是外部类成员
         不受权限控制
    外部类----->内部类
        成员方法: 创建内部类对象,通关对象访问
        静态方法: 创建外部类对象,创建内部类对象,通过对象访问
        不受权限控制
    内部类----->外部其他类
        创建外部其他类对象,通过对象访问 受权限控制
    外部其他类-->内部类
        创建外部类对象,再创建内部类对象 受权限控制
         Outer.Inner inner = new Outer().new Inner();
         Outer outer = new Outer();
         Outer.Inner inner = outer.new Inner();


 */
public class Demo {
    int a = 11;
    private String s = "aaa";
    public static void main(String[] args) {
        // 外部其他类-->内部类
        // 先创建外部类对象,再创建内部类对象
        //Outer outer = new Outer();
        //Outer.Inner inner = outer.new Inner();
        // 上下等价
        Outer.Inner inner = new Outer().new Inner();
        inner.innerMethod2();
        // System.out.println(inner.aa);

    }
}

// 外部类
class Outer{
    // 外部类的成员变量
    int a = 1;
    static int b = 1;
    private int c =2;

    // 外部类的成员方法
    public void outerNormalMethod() {
        // 外部类----->内部类
        // 创建内部类的对象
        Inner inner = new Inner();
        // 通过内部类对象访问
        System.out.println(inner.aa);
        inner.innerMethod2();

    }

    // 外部类的静态方法
    public static void outerStaticMethod() {
        // 创建外部类对象 再创建内部类对象
        // Inner inner1 = new Outer().new Inner();
        Outer outer = new Outer();
        Inner inner = outer.new Inner();
        // Inner inner = new Inner();
        inner.innerMethod2();
        System.out.println(inner.aa);
    }

    // 定义成员内部类
    class Inner{
        // 成员变量
        private int aa = 10;
        int a = 100;

        // 定义成员方法
        void innerMethod() {
            // 内部类----->外部类
            System.out.println(c);
            outerNormalMethod();

            // 访问同名的成员a
            // this.a访问的是内部类的成员
            System.out.println(this.a);
            // 想要访问外部类的同名成员
            // 外部类名字.this.去访问
            System.out.println(Outer.this.a);

        }

        void innerMethod2() {
            // 内部类----->外部其他类
            // 创建外部其他类对象访问
            Demo demo = new Demo();
            System.out.println(demo.a);
            // System.out.println(demo.s);
        }

    }
}